<!DOCTYPE html>
<meta charset=utf-8>
<title>Validate cases where element-based scroll offsets are unresolved.</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/web-animations/testcommon.js"></script>
<script src="testcommon.js"></script>

<style>
    .scroller {
        overflow: auto;
        height: 500px;
        width: 500px;
        will-change: transform;
    }

    .contents {
        height: 2000px;
        width: 2000px;
        position: relative;
    }

    #start, #end {
        background: blue;
        border-top: 5px solid pink;
        box-sizing: border-box;
        width: 100%;
        height: 50px;
    }

    #start {
        position: absolute;
        top: 50px;
    }

    #end {
        position: absolute;
        top: 1050px;
    }
</style>
<div id="log"></div>

<div id="not_a_descendant"></div>

<script>
'use strict';

promise_test(async t => {
    const scroller = createScrollerWithStartAndEnd(t);
    t.add_cleanup(() => scroller.remove());
    scroller.scrollTo({ top: 500 });

    const not_a_descendant = document.querySelector("#not_a_descendant");
    const end = document.querySelector("#end")

    const timeline = createScrollTimeline(t, {
        scrollSource: scroller,
        orientation: 'block',
        timeRange: 1000,
        scrollOffsets: [{ target: not_a_descendant }, { target: end }]
    });

    await waitForNextFrame();
    assert_equals(timeline.currentTime, null, "The timeline should not be active.");
}, "A valid element-based offset's target should be a descendant of timeline's source");

promise_test(async t => {
    const scroller = createScrollerWithStartAndEnd(t);
    t.add_cleanup(() => scroller.remove());
    scroller.scrollTo({ top: 500 });

    const start = document.querySelector("#start");
    const end = document.querySelector("#end")

    const timeline = createScrollTimeline(t, {
        scrollSource: scroller,
        orientation: 'block',
        timeRange: 1000,
        scrollOffsets: [{ target: start }, { target: end }]
    });

    start.style.display = "none";
    await waitForNextFrame();
    assert_equals(timeline.currentTime, null, "The timeline should not be active.");

    start.style.display = "block";
    await waitForNextFrame();
    assert_not_equals(timeline.currentTime, null, "The timeline should be active.");
}, "A valid element-based offset's target should have a layout box");
</script>